#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>

/*
 * 不同的 mqtt 客户端定义了不同的错误代码，所以这里用于保存mqtt错误码的变量名和类型
 */ 

// 定义一个线程局部存储的变量，用于保存当前线程的错误码
// 线程局部存储保证每个线程都有自己的变量副本，互不干扰
static _Thread_local int native_errno = 0;
// 定义一个线程局部存储的变量，用于保存当前线程的错误信息
// 线程局部存储保证每个线程都有自己的变量副本，互不干扰
static _Thread_local char errmsg[256];
int thmar_get_native_errno()
{
    return native_errno;
}

void thmar_set_native_errno(int err)
{
    native_errno = err;
}

const char *thmar_get_errmsg()
{
    return errmsg;
}

void thmar_set_errmsg(const char *msg)
{
    if (msg)
    {
        strncpy(errmsg, msg, sizeof(errmsg));
    }
    else
    {
        errmsg[0] = '\0';
    }
}

void thmar_set_err(int err, const char *msg)
{
    native_errno = err;
    if (msg)
    {
        strncpy(errmsg, msg, sizeof(errmsg));
    }
    else
    {
        errmsg[0] = '\0';
    }
}
void thmar_clear_err()
{
    native_errno = 0;
    errmsg[0] = '\0';
}

void thmar_sprintf_err(const char *fmt, ...)
{
    if (fmt)
    {
        va_list args;
        va_start(args, fmt);
        vsnprintf(errmsg, sizeof(errmsg), fmt, args);
        va_end(args);
    }
    else
    {
        errmsg[0] = '\0';
        return;
    }
}

void thmar_print_local_err()
{
    printf("errno: %d, errmsg: %s\n", native_errno, errmsg);
}